module.exports = (app) => {
  const { Schema, createModel, getModelName, pre } = app.jax.mongoose
  const modelName = getModelName(__filename)

  const schema = new Schema({
    storeNo: Number, // 服务站编号
    storeName: String, // 服务站名称
    tel: String, //  服务站电话
    cover: String, // 封面图

    managerName: String, // 店长姓名
    managerMobile: String, // 店长手机号

    username: String, // 管理员账号
    password: String, // 管理员密码
    mobile: String, // 管理员手机号

    adminId: Schema.Types.ObjectId, // 账号ID

    zone: String, // 大区
    // businessName: String, // 商家名称
    openStartTime: String,
    openEndTime: String,

    province: String, // 省
    city: String, // 市
    district: String, // 区
    detaileAddress: String, // 详细地址
    address: String, // 完整地址
    lng: { type: Number, set: (value) => Number(value) || null }, // 经度
    lat: { type: Number, set: (value) => Number(value) || null }, // 纬度

    location: {
      type: {
        type: String, // 不要修改为"location"
        enum: ['Point'], // 'location.type' 必须是 'Point'
      },
      coordinates: {
        type: [Number], // [经度, 纬度]
      },
    },

    files: [String], // 附件

    canCustom: { type: Boolean, default: false }, // 自定义权限
  })

  // 创建2dsphere索引以支持地理空间查询
  schema.index({ location: '2dsphere' })

  // 保持
  schema.pre('save', function (next) {
    if (this.lng && this.lat) {
      this.location = {
        type: 'Point',
        coordinates: [this.lng, this.lat],
      }
    }

    if (this.isNew) {
      Model.findOne({})
        .sort({ storeNo: 'DESC' })
        .then((doc) => {
          this.storeNo = (doc?.storeNo || 999) + 1
          next()
        })
    } else {
      next()
    }
  })

  // 查询前
  schema.pre('find', function () {
    this.select('-location')
  })

  schema.pre('findOne', function () {
    this.select('-location')
    // delete this.location
  })

  // 定义虚拟属性来排除敏感字段
  // schema.methods.toJSON = function () {
  //   const obj = this.toObject()
  //   delete obj.location
  //   return obj
  // }

  const Model = createModel(modelName, schema)

  return Model
}
